![PICTというツール(3)](https://images.ctfassets.net/ct0aopd36mqt/1dD7b8HkT2sbiJzUIewMTD/e5cdc6f33c4fdd9d798f11a4564612ff/eyecatch_developersio_darktone_1200x630.jpg)
PICTというツール(3)
こんにちは、森永です。
今回は PICT が生成したテストケースが、3つのパラメータを網羅できているかを検証します。
組み合わせ候補の作成
3つのパラメータの組み合わせ候補は、
(候補1×候補2×候補3)+(候補1×候補2×候補4)+(候補1×候補3×候補4)+(候補2×候補3×候補4)
ですから、(28×11×9)+(28×11×9)+(28×9×9)+(11×9×9)=8,703通りとなります。
前回の2項目の組み合わせ候補はExcelで作成したのですが、今回はさすがに手作業は面倒なのでツールを作成しました。
#!/bin/bash # パラメータリストの設定 ITEMS_1=rail1.lst # 山手線のパラメータリスト(28駅) ITEMS_2=rail2.lst # 東上線のパラメータリスト(11駅) ITEMS_3=rail3.lst # 有楽町線のパラメータリスト(9駅) ITEMS_4=rail4.lst # 丸の内線のパラメータリスト(9駅) # 3項組合せ # 候補1×候補2×候補3 cat ${ITEMS_1} | while read LINE_1 do cat ${ITEMS_2} | while read LINE_2 do cat ${ITEMS_3} | while read LINE_3 do echo ${LINE_1} ${LINE_2} ${LINE_3} | awk '{ printf("%s\t%s\t%s\n", $1,$2,$3); }' done done done # 候補1×候補2×候補4 cat ${ITEMS_1} | while read LINE_1 do cat ${ITEMS_2} | while read LINE_2 do cat ${ITEMS_4} | while read LINE_4 do echo ${LINE_1} ${LINE_2} ${LINE_4} | awk '{ printf("%s\t%s\t%s\n", $1,$2,$3); }' done done done # 候補1×候補3×候補4 cat ${ITEMS_1} | while read LINE_1 do cat ${ITEMS_3} | while read LINE_3 do cat ${ITEMS_4} | while read LINE_4 do echo ${LINE_1} ${LINE_3} ${LINE_4} | awk '{ printf("%s\t%s\t%s\n", $1,$2,$3); }' done done done # 候補2×候補3×候補4 cat ${ITEMS_2} | while read LINE_2 do cat ${ITEMS_3} | while read LINE_3 do cat ${ITEMS_4} | while read LINE_4 do echo ${LINE_2} ${LINE_3} ${LINE_4} | awk '{ printf("%s\t%s\t%s\n", $1,$2,$3); }' done done done
これを実行します。
ubuntu:~$ ls -1 crpairs.sh parameters.txt rail1.lst rail2.lst rail3.lst rail4.lst verify.sh ubuntu.txt windows.txt ubuntu:~$ bash crpairs.sh > all_3pairs.txt ubuntu:~$ wc -l all_3pairs.txt 8703 all_3pairs.txt ubuntu:~$ head all_3pairs.txt 山手線:東京 東上線:池袋 有楽町:池袋 山手線:東京 東上線:池袋 有楽町:要町 山手線:東京 東上線:池袋 有楽町:千川 山手線:東京 東上線:池袋 有楽町:小竹向原 山手線:東京 東上線:池袋 有楽町:氷川台 山手線:東京 東上線:池袋 有楽町:平和台 山手線:東京 東上線:池袋 有楽町:地下鉄赤塚 山手線:東京 東上線:池袋 有楽町:地下鉄成増 山手線:東京 東上線:池袋 有楽町:和光市 山手線:東京 東上線:北池袋 有楽町:池袋 ubuntu:~$
これで、8,703通りの組み合わせができました。
「そんなに大量のテストなんかできねーよ!」なんて、ここでは言いっこなしですよ。
テストケースの検証
PICTは標準では2つのパラメータの組み合わせを網羅しますが、/oオプションでパラメータ数を変更することができます。
下の実行結果は、①3パラメータでの組み合わせを指定してPICTを実行、②生成されたテストケースをUTF-8に変更する、③生成されたテストケースの行数を確認する、④テストケースの先頭数行を確認する、という手順で実行しています。
ubuntu:~$ "$PICT_PATH/pict.exe" parameters.txt /o:3 > ubuntu_3pairs.txt …① ubuntu:~$ nkf -E -w ubuntu_3pairs.txt > ubuntu_3pairs_utf8.txt …② ubuntu:~$ wc -l ubuntu_3pairs* …③ 2944 ubuntu_3pairs.txt 2944 ubuntu_3pairs_utf8.txt 5888 合計 ubuntu:~$ head ubuntu_3pairs_utf8.txt …④ 山手線 接続線1 接続線2 接続線3 山手線:駒込 東上線:池袋 有楽町:地下鉄成増 丸の内:新大塚 山手線:神田 東上線:下板橋 有楽町:地下鉄赤塚 丸の内:新大塚 山手線:西日暮里 東上線:上板橋 有楽町:氷川台 丸の内:淡路町 山手線:新橋 東上線:和光市 有楽町:要町 丸の内:大手町 山手線:東京 東上線:中板橋 有楽町:池袋 丸の内:本郷三丁目 山手線:有楽町 東上線:東武練馬 有楽町:小竹向原 丸の内:御茶ノ水 山手線:神田 東上線:和光市 有楽町:池袋 丸の内:後楽園 山手線:浜松町 東上線:池袋 有楽町:小竹向原 丸の内:大手町 山手線:御徒町 東上線:下板橋 有楽町:池袋 丸の内:新大塚 ubuntu:~$
果たして、生成結果には全ての組み合わせ候補が網羅されているのでしょうか?
前回作成した verify.sh というツールを少し変更して、3パラメータを検証できるようにしました。
リスト中のハイライト表示されている行が、変更した箇所です。
#!/bin/bash ############################################################################### # シェル内関数定義 ############################################################################### helpMessage() { echo "" echo "名称: verify.sh" echo "形式: verify.sh [-r resultfile -p candidatefile | [-h | --help]]" echo "概要: パラメタの組合せ候補が、pictが生成した組合せ結果に含まれる" echo " かを検査します。組合せ結果に含まれない候補を、標準出力に出" echo " 力します。" echo "引数: -r resultfile 組合せ結果ファイルを指定します。" echo " -p candidatefile 組合せ候補ファイルを指定します。" echo " -h | --help このヘルプを表示します。" echo "" exit 0 } usageMessage() { echo "usage: verify.sh [-r resultfile -p candidatefile | [-h | --help]]" 1>&2 exit 1 } nofileMessage() { echo "$@: file not found." 1>&2 exit 2 } ############################################################################### # 引数処理 ############################################################################### # ヘルプ表示処理 for argv in $@ do if [ "$argv" = "-h" -o "$argv" = "--help" ]; then helpMessage exit $? fi done # 引数の数をチェック if [ $# -lt 4 ]; then usageMessage exit $? fi # パラメタの初期化 unset RESULT_FILE unset ALL_PAIRS # パラメタの取得 while getopts r:p: argv do case "$argv" in "r") RESULT_FILE="$OPTARG" ;; "p") ALL_PAIRS="$OPTARG" ;; esac done # パラメタの長さチェック if [ ${#RESULT_FILE} -le 0 ]; then usageMessage exit $? fi if [ ${#ALL_PAIRS} -le 0 ]; then usageMessage exit $? fi # ファイルの存在チェック if [ ! -f "$RESULT_FILE" ]; then nofileMessage "$RESULT_FILE" exit ? fi if [ ! -f "$ALL_PAIRS" ]; then nofileMessage "$ALL_PAIRS" exit ? fi ############################################################################### # メイン処理 ############################################################################### # 組合せ候補をファイルから1行ずつ読み出す cat $ALL_PAIRS | while read pair_line do # 組合せを分解する PAIR_MEMBERS=(`echo $pair_line | sed -e 's/\t/ /g'`) # PICTの出力結果から検査対象になる全行を読み出す res_line=`grep ${PAIR_MEMBERS[0]} $RESULT_FILE` RES_MEMBERS=(`echo $res_line | sed -e 's/\t/ /g'`) # PICT出力結果に組合せ候補が含まれるか検査する found1=0 found2=0 for res_mem in ${RES_MEMBERS[@]} do if [ "$res_mem" = ${PAIR_MEMBERS[1]} ]; then found1=1 fi if [ "$res_mem" = ${PAIR_MEMBERS[2]} ]; then found2=1 fi if [ $found1 -eq 1 -a $found2 -eq 1 ]; then break; fi done # 検査結果の出力 if [ $found1 -eq 0 -o $found2 -eq 0 ]; then echo "${pair_line}: not found." fi done
そして、実行します。
ubuntu:~$ bash verify.sh -r ubuntu_3pairs_utf8.txt -p all_3pairs.txt ubuntu:~$
テストケースの中には、全ての組み合わせが網羅されていることが確認できました。
試しに、前回の2パラメータ用のテストケースに、今回の3パラメータが網羅されているかを確認してみました。
ubuntu:~$ bash verify.sh -r ubuntu.txt -p all_3pairs.txt ubuntu:~$
なんと!2パラメータ用のテストケースも、3パラメータの組み合わせが全部網羅されています。
これがテストケースに因るものなのかどうかは、今回の検証では分かりませんでした。
次回以降にもう少し検証したいと思います。
それでは。